public class ThreadDemo2 {
    public static void main(String[] args) throws InterruptedException {

        Thread thread=new Thread(()->{
            System.out.println("dada");
        });
       System.out.println(thread.getState()); //NEW;
        thread.start();
        System.out.println(thread.getState());  //Runnable;
        Thread.sleep(1000);
        System.out.println(thread.getState());
    }
}
//synchronized是解决线程安全问题（因为存在并发，随机调度）的一个有效手段，
//产生线程安全问题的典型问题：1.多个线程对同一个变量修改
//2.原子性问题，就是操作不是原子的
//3.内存可见性问题
//4.指令重排序问题

//加锁是修饰的是方法和代码块，当修饰普通方法时：锁对象是this； 当修饰静态方法时，锁对象是类对象
//当修饰代码块的锁，锁对象是手动指定的

//死锁发生的原因，进程在竞争资源是，都在互相等待对方手里的资源，造成推进不当
//产生死锁的四个必要条件是：
//1.非抢占：当一个进程获取到资源后，另一个进程不能抢走
//2.互斥：对于临界资源来说，一个进程获取，另一个不能获取
//3.请求和保持条件：线程1对资源A申请，并且继续对已有的资源占有
//循环等待条件：假设有两个线程和两个资源，线程1拥有资源A，并且等待获取线程2释放的资源B，线程2拥有资源B，并且等待获取线程1释放资源A
//在java中前三个条件已经改变不了
//所以就破环循环等待即可，既给线程一个执行顺序，让每个线程都按照这个执行顺序来申请资源
//典型问题（哲学家就餐问题）
